查看原文
其他

当我们设计一个专用处理器的时候我们在干什么?(上)

2017-02-26 T.S. StarryHeavensAbove

最近常说机器学习专用处理器设计的话题。感觉有必要说说什么是专用处理器,以及我们设计一个专用处理器倒底是在做什么。当然这些都是个人经验,说的不对的大家尽管批评。


首先,什么是专用处理器?


先说处理器的概念,wiki定义是“In computing, a processor is an electronic circuit which performs operations on some external data source, usually memory or some other data stream”。专用处理器就是针对特定应用或者领域的处理器。学术上有个Domain Specific Computing的概念,下面这个高大上的图是我当年在这个方向定的科研计划



言归正传,最为通用的处理器当然是CPU(比如intel的桌面CPU,ARM的嵌入式CPU),可以运行任何程序,处理各种数据。但问题是CPU对某些应用效率太低(处理能力不够,无法实时处理,或者是能耗太大)。比如,处理graphic不行,于是出现了GPU;信号处理不行,于是出现了DSP。GPU可以做图像处理,也可以做DNN的training和inference,但是在处理某些DNN应用的时候效率不高,于是有了专用针对这些应用处理器,也就是我最近讨论的DL Processor。所以说,专用处理器也是个相对概念,相对CPU而言,别的处理器都是专用处理器。而我想讨论的专用处理器是相对GPU/DSP而言更为“专业”的处理器。


为了进一步说明专用处理器,这里简单说一下指令集的概念。指令集就是一个处理器的硬件可以支持的基本操作(符号化的抽象描述)的集合。(wiki:“An instruction set, with its instruction set architecture (ISA), is the interface between a computer's software and its hardware, and thereby enables the independent development of these two computing realms; it defines the valid instructions that a machine may execute.”)。通常,处理器的指令集架构(ISA:Instruction Set Architecture)确定它的功能。最著名的x86就是intel CPU的指令集。一个通用处理器,为了适应所有的应用,其指令集必须考虑最大的灵活性。这种灵活性主要表现在指令功能是不是完备和粒度是不是够细。举个例子,大家都知道FFT操作是由蝶形运算组成的;而蝶形运算是由复数乘法和加法组成;复数的乘法和加法又是由普通的乘法和加法组成。如果你设计一个可以处理FFT的处理器,可以有几种方法设计指令集。最简单的就是用一个通用指令集,指令集里有最基本的乘法和加法就没问题。FFT的处理分解为这些基本运算,一步一步完成。这样,你的处理器具有最高的灵活性,如果这个处理器不做FFT,还可以做其它的运算。还有一种方法,指令集里只设计一条指令,fft指令,执行这条指令就可以完成所有操作。当然,这样显然没什么灵活性。即使是要做一个“1+1”的操作,你的处理器也干不了。这个例子比较极端,实际设计中一般是折中的处理。但是后者就是我想讨论的专用处理器的一个重要特点,一条指令完成更多的处理。不过为什么要牺牲灵活性呢?请看第二部分的说明。


专用处理器的覆盖范围也很广,有的能够运行标准的C程序,比如很多ASIP(Application Specific ISA Processor);有的只有很简单的可编程性,比如一些可配置的硬件加速器(Configurable Hardware Accelerators),典型的例子就是“只运行一条fft指令的”FFT硬件加速器(当然具体的硬件设计里这能没有指令的概念,只有配置的概念)。我讨论的重点是至少具有一定可编程能力,可以(并需要)运行程序的专用处理器。


第二,为什么做(或者不做)专用处理器?


做专用处理器的原因或者动力基本就是两个字,“效率”。拿前面的FFT处理器来看,如果用通用处理器(只有通用的乘加运算),做一个256点的FFT可能需要运行几千条指令,即使处理器每个周期可以执行几条指令,也得很长时间。这对于很多对时延要求很苛刻的场景是很难忍受的。如果,用一个每周期就能做做一次蝶形运算的专用处理器,那么这个时间会缩短到几百个周期。当然,一个周期执行一次蝶形运算,相当于一次做了好几个乘法和加法,需要更多的硬件电路。


当然,这个说法只是一个简单化的说法。实际上衡量处理器效率的标准很多,比如能耗效率。而影响处理器效率的因素和设计优化方法也很多,这就是计算机体系结构这个领域研究的内容。不过,一般来说,如果我们明确的知道我们的处理器的目标应用场景(有限的应用),比如只用来做FFT的运算或者CNN(卷积神经网络)加速,我们在设计中就可以不考虑其它的需求,充分发掘目标需求的特点,实现最有效的设计。


那么为什么不做专用处理器呢?因为,专用处理器违背了“不要重新发明轮子”原则。从某种程度上说,专用处理器就是重新发明轮子,既不经济和又有很大风险。另一方面,专用处理器的应用范围比较窄,其目标市场规模很有可能无法让你获利。总的来说,如果做专用处理器获得的收益不能超过开发它花的成本和面临的风险的话,还是尽早放弃为好。


当然,这个道理基本是废话。问题是做专用处理器的成本和风险是什么样的呢?

且听下回分解。


T.S.

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存